package com.binhthuan.catechist.server.domain;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Thông tin chung về thành viên, tương ứng với bảng
 *         <b>ec_person</b> trong cơ sở dữ liệu.
 */
@Entity
@Table(name="ec_person")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Person extends AbstractObject {

    /**
     * Mã thành viên.
     */
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id")
    @Expose
    private Integer id;
    
    /**
     * Tên thánh.
     */
    @Column(name="patron_saint", length=50)
    @Expose
    private String patronSaint;
    
    /**
     * Họ gọi.
     */
    @Column(name="last_name", length=50)
    @Expose
    private String lastName;
    
    /**
     * Tên gọi.
     */
    @Column(name="first_name", length=20)
    @Expose
    private String firstName;
    
    /**
     * Họ tên (viết thường và không dấu). 
     */
    @Column(name="lower_case_name", length=120)
    @Expose
    private String lowerCaseName;
    
    /**
     * Giới tính (là nam hay không).
     */
    @Column(name="is_male")
    @Expose
    private Boolean male;
    
    /**
     * Hình đại diện.
     */
    @Column(name="avatar", length=255)
    @Expose
    private String avatar;
    
    /**
     * Ngày sinh.
     */
    @Column(name="birthday")
    @Expose
    private Date birthday;
    
    /**
     * Địa chỉ.
     */
    @Column(name="address", length=255)
    @Expose
    private String address;
    
    /**
     * Giáo khu.
     */
    @ManyToOne
    @JoinColumn(name="area_id")
    @Expose
    private Area area;
    
    /**
     * Điện thoại liên lạc.
     */
    @Column(name="phone", length=20)
    @Expose
    private String phone;

    /**
     * Được kích hoạt hay chưa.
     */
    @Column(name="is_active")
    @Expose
    private Boolean active;

    /**
     * Xóa thông tin tạm thời.
     */
    @Column(name="is_temporary_delete")
    @Expose
    private Boolean temporaryDelete;

    public Person() {
        
    }
    
    /**
     * Lấy mã thành viên.
     * @return Mã thành viên.
     */
    public Integer getId() {
        return id;
    }

    /**
     * Gán mã thành viên.
     * @param id
     *            Mã thành viên.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Lấy tên thánh.
     * @return Tên thánh.
     */
    public String getPatronSaint() {
        return patronSaint;
    }

    /**
     * Gán tên thánh.
     * @param patronSaint
     *            Tên thánh.
     */
    public void setPatronSaint(String patronSaint) {
        this.patronSaint = patronSaint;
    }

    /**
     * Lấy họ gọi.
     * @return Họ gọi.
     */
    public String getLastName() {
        return lastName;
    }

    /**
     * Gán họ gọi.
     * @param lastName
     *            Họ gọi.
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    /**
     * Lấy tên gọi.
     * @return Tên gọi.
     */
    public String getFirstName() {
        return firstName;
    }

    /**
     * Gán tên gọi.
     * @param firstName
     *            Tên gọi.
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Lấy họ tên (viết thường và không dấu).
     * @return Họ tên (viết thường và không dấu).
     */
    public String getLowerCaseName() {
        return lowerCaseName;
    }

    /**
     * Gán họ tên (viết thường và không dấu).
     * @param lowerCaseName
     *            Họ tên (viết thường và không dấu).
     */
    public void setLowerCaseName(String lowerCaseName) {
        this.lowerCaseName = lowerCaseName;
    }

    /**
     * Lấy giới tính (là nam hay không).
     * @return <b>true</b> nếu là nam.
     */
    public Boolean isMale() {
        return male;
    }

    /**
     * Gán giới tính nam.
     * @param male
     *            <b>true</b> nếu là nam.
     */
    public void setMale(Boolean male) {
        this.male = male;
    }

    /**
     * Lấy hình đại diện.
     * @return Hình đại diện.
     */
    public String getAvatar() {
        return avatar;
    }

    /**
     * Gán hình đại diện.
     * @param avatar
     *            Hình đại diện.
     */
    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    /**
     * Lấy ngày sinh nhật.
     * @return Ngày sinh nhật.
     */
    public Date getBirthday() {
        return birthday;
    }

    /**
     * Gán ngày sinh nhật.
     * @param birthday
     *            Ngày sinh nhật.
     */
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * Lấy địa chỉ.
     * @return Địa chỉ.
     */
    public String getAddress() {
        return address;
    }

    /**
     * Gán địa chỉ.
     * @param address
     *            Địa chỉ.
     */
    public void setAddress(String address) {
        this.address = address;
    }

    /**
     * Lấy giáo khu.
     * @return Giáo khu.
     */
    public Area getArea() {
        return area;
    }

    /**
     * Gán giáo khu.
     * @param area
     *            Giáo khu.
     */
    public void setArea(Area area) {
        this.area = area;
    }

    /**
     * Lấy điện thoại liên lạc.
     * @return Điện thoại liên lạc.
     */
    public String getPhone() {
        return phone;
    }

    /**
     * Gán điện thoại liên lạc.
     * @param phone
     *            Điện thoại liên lạc.
     */
    public void setPhone(String phone) {
        this.phone = phone;
    }
    
    /**
     * Lấy tên đầy đủ.
     * @return Tên đầy đủ.
     */
    @Expose
    private transient String fullName;
    
    public String getFullName() {
        fullName = getPatronSaint() + " " + getLastName() + " " + getFirstName();
        return fullName;
    }

    /**
     * Gán tên đầy đủ.
     * @param fullName
     *            Tên đầy đủ.
     */
    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    /**
     * Thông tin được kích hoạt hay chưa.
     * @return the active
     */
    public Boolean getActive() {
        return active;
    }

    /**
     * Kích hoạt thông tin.
     * @param active
     */
    public void setActive(Boolean active) {
        this.active = active;
    }

    /**
     * Thông tin có bị xóa tạm thời hay không.
     * @return the temporaryDelete
     */
    public Boolean getTemporaryDelete() {
        return temporaryDelete;
    }

    /**
     * Xóa tạm thời thông tin này ?
     * @param temporaryDelete the temporaryDelete to set
     */
    public void setTemporaryDelete(Boolean temporaryDelete) {
        this.temporaryDelete = temporaryDelete;
    }
}
